package tk.mybatis.springboot.share.util;

import java.util.Date;
import java.util.Map;
import java.util.Set;
import java.util.UUID;

import net.sf.json.JSONObject;

/**
 * 字符串工具类 title:StringsUtil form:Mr_xing
 * 
 * @author Xing
 * @date 2016年4月27日 上午10:32:02
 */
public class StringUtils {

	/**
	 * 重命名，根据当前时间毫秒+UUIU
	 * 
	 * @param fileName
	 * @return
	 */
	public static String reloadFile(String oleFileName) {
		if (StringUtils.isEmpty(oleFileName)) {
			return oleFileName;
		}
		String[] arr = oleFileName.split("\\.");
		String fileName = System.currentTimeMillis() + "_" + UUID.randomUUID();
		if (arr.length > 1) {
			fileName = fileName + "." + arr[arr.length - 1];
		}
		return fileName;
	}

	/**
	 * 把带路径的文件地址解析为真实文件名 /25h/upload/hc/1448089199416_06cc07bf-7606-4a81-9844-87d847f8740f.mp4 解析为 1448089199416_06cc07bf-7606-4a81-9844-87d847f8740f.mp4
	 * 
	 * @param args
	 */
	public static String get_fileName(String url) {
		String[] bb = url.split("/");
		return bb[bb.length - 1];
	}

	/**
	 * unicode格式转化为String \u597d = 好
	 * 
	 * @param dataStr
	 * @return
	 */
	public static String decodeUnicode(String dataStr) {
		if (dataStr.indexOf("\\u") == -1) {
			return dataStr;
		}
		if (dataStr.length() > 6) {
			String str2 = "";
			while (dataStr.length() >= 6) {
				int index1 = dataStr.indexOf("\\u");
				if (index1 != -1) {
					str2 += dataStr.substring(0, index1);
					str2 += decodeUnicode(dataStr.substring(index1, index1 + 6));
					dataStr = dataStr.substring(index1 + 6);
				} else {
					str2 += dataStr;
					return str2;
				}

			}

			return str2;
		}

		int start = 0;
		int end = 0;
		final StringBuffer buffer = new StringBuffer();
		while (start > -1) {
			end = dataStr.indexOf("\\u", start + 2);
			String charStr = "";
			if (end == -1) {
				charStr = dataStr.substring(start + 2, dataStr.length());
			} else {
				charStr = dataStr.substring(start + 2, end);
			}
			char letter = (char) Integer.parseInt(charStr, 16); // 16进制parse整形字符串。
			buffer.append(new Character(letter).toString());
			start = end;
		}
		return buffer.toString();
	}

	/**
	 * 判断是否包含汉字
	 * @param str
	 * @return
	 */
	public static boolean has_chinese(String str) {
		if (StringUtils.isEmpty(str)) {
			return false;
		}
		char[] chars = str.toCharArray();

		for (char c : chars) {
			if (c >= 19968 && c <= 171941) {// 汉字范围 \u4e00-\u9fa5 (中文)
				return true;
			}
		}
		return false;
	}

	/**
	 * 把传入的url解析为对象，？前面的解析为url，后面的解析为对象参数
	 * 
	 * @param url
	 * @return
	 */
	public static JSONObject getSiteByUrls(String url) {
		JSONObject json = new JSONObject();
		try {
			if (url.indexOf("?") != -1) {// 有拼接参数
				String[] str2 = url.split("[?]");
				json.accumulate("url", str2[0]);
				// 参数拼接
				if (str2[1].indexOf("&") != -1) {
					String[] str3 = str2[1].split("&");
					for (String str4 : str3) {
						// 判断a=b中是否有=
						if (str4.indexOf("=") != -1) {
							String[] str5 = str4.split("[=]");
							json.accumulate(str5[0], str5.length == 1 ? "" : str5[1]);
						}
					}
				}
			} else {
				json.accumulate("url", url);
			}
		} catch (Exception e) {
			System.out.println(url + ":解析出错");
		}
		return json;
	}

	/**
	 * 空和空字符串返回false
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isNotEmpty(String str) {
		return str == null || "".equals(str) ? false : true;
	}

	/**
	 * 空和空字符串返回true
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isEmpty(String str) {
		return !isNotEmpty(str);
	}

	/**
	 * 数组空和长度0返回false
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isNotEmpty(String[] str) {
		return str == null || str.length < 1 ? false : true;
	}

	/**
	 *  数组空和长度0返回true
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isEmpty(String[] str) {
		return !isNotEmpty(str);
	}

	/**
	 * 去掉字符串前后空格
	 * 
	 * @return
	 */
	public static String isTrim(String str) {
		if (isEmpty(str)) {
			return null;
		}
		return str.trim();
	}

	/**
	 * 是否是数字
	 * @param str
	 * @return
	 */
	public static boolean isNomber(String str) {
		if (StringUtils.isEmpty(str)) {
			return false;
		}

		try {
			Integer.parseInt(str);
		} catch (Exception e) {
			return false;
		}
		return true;
	}

	/**
	 * 解析身份证号码,得到出生年月和性别
	 * 
	 * @param idNo
	 *            身份证号码
	 */
	public static void parseIdNo(String idNo) {

		// 获取身份账号中出生年月日、性别
		Date birth = null;
		int gender = 0; // 0男，1女
		if (idNo != null && !"".equals(idNo)) {
			try {
				// 18位身份证号码
				if (idNo.length() == 18) {
					// 获取出生年月日

					birth = DateUtils.Str_Date(idNo.substring(6, 14), "yyyyMMdd");
					// 获取性别
					gender = Integer.parseInt(idNo.charAt(idNo.length() - 2) + "") % 2 == 0 ? 1 : 0;
				}
				// 15位身份证号码
				else if (idNo.length() == 15) {
					// 获取出生年月日
					birth = DateUtils.Str_Date("19" + idNo.substring(6, 12), "yyyyMMdd");
					// 获取性别
					gender = Integer.parseInt(idNo.charAt(idNo.length() - 1) + "") % 2 == 0 ? 1 : 0;
				}
			} catch (Exception e) {}
		}

		System.out.println("生日：" + DateUtils.Date_Str_3(birth) + "  性别:" + (gender == 0 ? "男" : "女"));
	}

	/**
	 * 首字母转小写
	 * 
	 * @param s
	 * @return
	 */
	public static String toLowerCaseFirstOne(String s) {
		if (Character.isLowerCase(s.charAt(0)))
			return s;
		else
			return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString();
	}

	/** 全部转换为小写 */
	public static String toLowerCaseAll(String s) {
		if (StringUtils.isNotEmpty(s)) {
			return s.toLowerCase();

		} else {
			return null;
		}
	}

	/**
	 * 首字母转大写
	 * 
	 * @param s
	 * @return
	 */
	public static String toUpperCaseFirstOne(String s) {
		if (Character.isUpperCase(s.charAt(0)))
			return s;
		else
			return (new StringBuilder()).append(Character.toUpperCase(s.charAt(0))).append(s.substring(1)).toString();
	}

	/** 全部转换为大写 */
	public static String toUpperCaseAll(String s) {
		if (StringUtils.isNotEmpty(s)) {
			return s.toUpperCase();

		} else {
			return null;
		}
	}

	/**
	 * 按照传入源url，裁剪为3部分，第一位路径（可能为空），第二位位文件名称，第三为文件后缀（可能为空）
	 * @param url
	 * @return
	 */
	public static String[] splitFileUrlAndType(final String url) {
		String[] strs = new String[3];

		if (StringUtils.isEmpty(url)) {
			return strs;
		}
		try {
			strs[0] = url.substring(0, url.lastIndexOf("/") + 1);

			String file = url.substring(url.lastIndexOf("/") + 1, url.length());
			int last = file.lastIndexOf(".");
			strs[1] = file.substring(0, last);
			strs[2] = file.substring(last + 1, file.length());

		} catch (Exception e) {
			//e.printStackTrace();
		}
		return strs;
	}

	/**
	 * 将请求地址的请求源替换（只替换域名/ip的，路径保留）
	 * http://120.76.155.64/pic/upload/file/2017/01/10/source_1484053391171_93ad49cd-3fcf-449f-84fc-ff8b6c2d553c.png
	 * 替换为，支持s及不带http://
	 * http://10.10.10.10:8044/
	 * 
	 * @param url	原地址
	 * @param fix_url 请求头
	 * @param keyword 标识之前的全部替换，比如  upload ,那么upload前面的全部被替换，空为只替换请求 ip域名等
	 * @return
	 */
	public static String chmod_change_url(String url, String fix_url, String keyword) {
		url = url.trim();
		String str = "";
		String fix_1 = "";
		String http = "http://";
		String https = "https://";

		if (http.equals(url.substring(0, http.length()))) {// 前缀等于http
			fix_1 = http;
		} else if (https.equals(url.substring(0, https.length()))) { //https
			fix_1 = https;
		} else {//不带前缀

		}

		url = url.substring(fix_1.length(), url.length());//截取到开始的
		url = url.substring(url.indexOf("/"), url.length()); // 截取除开Ip/域名后的

		if ('/' == url.charAt(0)) {
			url = url.substring(1, url.length()); // 截取除开Ip/域名后的
		}

		if (StringUtils.isNotEmpty(keyword)) {
			url = url.substring(url.indexOf(keyword), url.length());
		}

		str = fix_url + url;

		return str;
	}

	/**
	 * 根据模板和集合进行变量填充
	 * @param content
	 * @param map
	 * @return
	 */
	public static String mach_temp(String content, Map<String, String> map) {
		//根据模板和对象，填充值
		String info = content;
		Set<String> set = map.keySet();
		for (String str : set) {
			String value = map.get(str);
			if (StringUtils.isNotEmpty(str) && StringUtils.isNotEmpty(value)) {
				//替换变量
				info = info.replaceAll("\\{" + str + "\\}", value);
			}

		}
		return info;
	}


	/** 加密银行卡号 */
	public static String encrypt_bank(String bank_no) {
		if (StringUtils.isEmpty(bank_no) || bank_no.length() < 5) {
			return bank_no;
		}
		StringBuffer str = new StringBuffer(bank_no.substring(0, 4));
		str.append("****");
		str.append(bank_no.subSequence(bank_no.length() - 4, bank_no.length()));

		return str.toString();
	}


}

